#include <REGX52.H>
#include "Delay.h"

sbit RCK=P3^5; //对P3^5口重新定义方便理解，后面对RCLK操作即等于对P3^5口进行操作
sbit SCK=P3^6; //为SRCLK口，因为重复定义从而改变命名方式
sbit SER=P3^4;

#define MTRIX_LED_PORT		P0  //重新定义申明寄存器

/**
  * @brief  74HC595写入一个字节
  * @param  要写入的字节
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte) //运行该函数可以使得八位数据输入八个引脚中
{
	unsigned char i;
	for (i=0;i<8;i++) //八位二进制数所以最多移动八位
	{
		SER=Byte&(0x80>>i); //取出最高位的值并赋值给SER
		SCK=1; //数据移位
		SCK=0;//为下次移位做好准备
	}
//	SER=Byte&0x40; //取出第二位的值并赋值给SER
//	SCK=1;
//	SCK=0;
//	...
	RCK=1; //将8位数据传输到IO口上
	RCK=0; //使用后清零
}

/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列，范围：0~7，0在最左边
			Date 选择列现实的数据，高位在上，1为亮，0为灭
  * @retval 无
  */
void MartixLED_ShowColumn(unsigned char Column,Date)
{
	_74HC595_WriteByte(Date); //选择行
	MTRIX_LED_PORT=~(0x80>>Column); //选择列，由于该点阵屏为共阴极连接，0为选中，故取反
	Delay(1); //延时
	MTRIX_LED_PORT=0xFF; //位清零  目的消除串行的影响

}

void main()
{
	SCK=0; //先将SRCLK给低电平
	RCK=0; //将RCLK给低电平
	_74HC595_WriteByte(0xF0);
	while(1)
	{
		MartixLED_ShowColumn(0,0x3C);
		MartixLED_ShowColumn(1,0x42);
		MartixLED_ShowColumn(2,0xA9);
		MartixLED_ShowColumn(3,0x85);
		MartixLED_ShowColumn(4,0x85);
		MartixLED_ShowColumn(5,0xA9);
		MartixLED_ShowColumn(6,0x42);
		MartixLED_ShowColumn(7,0x3C);
	}
}